#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

// 线程函数返回结果的结构体
typedef struct Result
{
    char *p;
    int len;
} Result;

// 红玫瑰线程
void *red_thread(void *argv)
{
    char code = *(char *)argv;
    printf("红玫瑰线程开始执行, 收到参数code: %c \n", code);

    char input[10];
    while (1)
    {
        fgets(input, 10, stdin);
        if (input[0] == code)
        {
            Result *result = malloc(sizeof(Result));
            char *msg = "红玫瑰独自去纽约";
            result->p = msg;
            result->len = strlen(msg);

            printf("红玫瑰离开了\n");
            pthread_exit(result);
        }
        else
        {
            printf("红玫瑰接收到消息:%s, 她还在等你 \n", input);
        }
    }
}

// 白玫瑰线程
void *white_thread(void *argv)
{
    char code = *(char *)argv;
    printf("白玫瑰线程开始执行, 收到参数code: %c \n", code);

    char input[10];
    while (1)
    {
        fgets(input, 10, stdin);
        if (input[0] == code)
        {
            Result *result = malloc(sizeof(Result));
            char *msg = "白玫瑰独自去巴黎";
            result->p = msg;
            result->len = strlen(msg);

            printf("白玫瑰离开了\n");
            // pthread_exit();
            return result;
        }
        else
        {
            printf("白玫瑰接收到消息:%s, 她还在等你 \n", input);
        }
    }
}

int main(int argc, char const *argv[])
{
    // 线程标识
    pthread_t thread_red;
    pthread_t thread_white;

    // 线程返回结果：Result的指针
    Result *red_result;
    Result *white_result;

    char red_code = 'r';   // 传递给红玫瑰线程函数的参数
    char white_code = 'w'; // 传递给白玫瑰线程函数的参数

    // 创建红玫瑰线程
    pthread_create(&thread_red, NULL, red_thread, &red_code);
    // 创建白玫瑰线程
    pthread_create(&thread_white, NULL, white_thread, &white_code);

    // 等待红玫瑰线程结束
    pthread_join(thread_red, (void **)&red_result);
    // 等待白玫瑰线程结束
    pthread_join(thread_white, (void **)&white_result);

    printf("main线程得到红玫瑰结局：%s\n", red_result->p);
    printf("main线程得到白玫瑰结局：%s \n", white_result->p);
    printf("%d, %d \n", red_result->len, white_result->len);

    // 释放动态申请的内存
    free(red_result);
    free(white_result);

    return 0;
}
